/*
 * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.sun.corba.se.impl.transport;

import java.io.IOException;

import com.sun.corba.se.pept.transport.Connection;
import com.sun.corba.se.pept.transport.ReaderThread;
import com.sun.corba.se.pept.transport.Selector;

import com.sun.corba.se.spi.orb.ORB;
import com.sun.corba.se.spi.orbutil.threadpool.Work;

import com.sun.corba.se.impl.orbutil.ORBUtility;

public class ReaderThreadImpl
    implements
    ReaderThread,
    Work {

  private ORB orb;
  private Connection connection;
  private Selector selector;
  private boolean keepRunning;
  private long enqueueTime;

  public ReaderThreadImpl(ORB orb,
      Connection connection, Selector selector) {
    this.orb = orb;
    this.connection = connection;
    this.selector = selector;
    keepRunning = true;
  }

  ////////////////////////////////////////////////////
  //
  // ReaderThread methods.
  //

  public Connection getConnection() {
    return connection;
  }

  public void close() {
    if (orb.transportDebugFlag) {
      dprint(".close: " + connection);
    }

    keepRunning = false;
  }

  ////////////////////////////////////////////////////
  //
  // Work methods.
  //

  // REVISIT - this needs alot more from previous ReaderThread.
  public void doWork() {
    try {
      if (orb.transportDebugFlag) {
        dprint(".doWork: Start ReaderThread: " + connection);
      }
      while (keepRunning) {
        try {

          if (orb.transportDebugFlag) {
            dprint(".doWork: Start ReaderThread cycle: "
                + connection);
          }

          if (connection.read()) {
            // REVISIT - put in pool;
            return;
          }

          if (orb.transportDebugFlag) {
            dprint(".doWork: End ReaderThread cycle: "
                + connection);
          }

        } catch (Throwable t) {
          if (orb.transportDebugFlag) {
            dprint(".doWork: exception in read: " + connection, t);
          }
          orb.getTransportManager().getSelector(0)
              .unregisterForEvent(getConnection().getEventHandler());
          getConnection().close();
        }
      }
    } finally {
      if (orb.transportDebugFlag) {
        dprint(".doWork: Terminated ReaderThread: " + connection);
      }
    }
  }

  public void setEnqueueTime(long timeInMillis) {
    enqueueTime = timeInMillis;
  }

  public long getEnqueueTime() {
    return enqueueTime;
  }

  public String getName() {
    return "ReaderThread";
  }

  ////////////////////////////////////////////////////
  //
  // Implementation.
  //

  private void dprint(String msg) {
    ORBUtility.dprint("ReaderThreadImpl", msg);
  }

  protected void dprint(String msg, Throwable t) {
    dprint(msg);
    t.printStackTrace(System.out);
  }
}

// End of file.
